//
//  StatusViewModel.swift
//  sina
//
//  Created by 江先铨 on 15/11/17.
//  Copyright © 2015年 jxqstatic. All rights reserved.
//

import UIKit
import AFNetworking
import SVProgressHUD
import SDWebImage

class StatusViewModel: NSObject {

    class func loadData(since_id  since_id: Int, max_id : Int , finished: (arr : [StatusModel]?) -> ()) { //定义一个statusmodel 的数组 执行回调
        //let AFN = AFHTTPSessionManager()
        
        let uslSting = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        guard let token = ViewModel().token else { //守卫 这个方法是需要确定token是一定有值 把token从一个可选类型变成一个确定存在的类型 如果token是没有值的话说明当前用户是没有登录的
            
            SVProgressHUD.showErrorWithStatus("你暂未登录")
            return
        }
        //获得用户的一个确定的用户的token 的值
        //var  因为在后面有给参数重新添加了一个键值 所以需要把参数类型改成 var 的类型
        var parameters = ["access_token" : token]
        
        if since_id > 0 {
           //添加参数 添加since_id 对应的键值 这个是请求参数 添加到请求参数中就可以了
           parameters["since_id"] = "\(since_id)"
        }
        
        //设置上拉加载更多的请求参数 若制定此参数 则返回ID小于或等于max_id的微博  默认为0
        if max_id > 0 {
           //在这里需要返回比下拉id- 1 的数据 如果是直接返回max_id 的话 会产生两条数据 这样会造成数据的错误
           parameters["max_id"] = "\(max_id - 1)"
        }
        
        
        Networking.sharedTools.requestJsonDict(.GET, urlString: uslSting, parmaters: parameters) { (result, error) -> () in
            
            if error != nil  {
            
              finished(arr: nil)
                return
            }
            
            if let arrM = result!["statuses"] as? [[String : AnyObject]] { //字典转模型 把数组中得值给arrm 模型  把字典中模型取出来赋值给数组 [[]] 相当于一个字典外面包了一层数组 这个就相当于把字典定义成数组的形式  statuse是数据中得一个字段 保存的时字典 需要数据取出来
                
                var list = [StatusModel]() //初始化的数组
                
                for item in arrM {
                    
                    let s = StatusModel(dict: item) //字典转模型
                    
                    list.append(s)
                }
                
             //  finished(arr: list) //执行回调 给数组中添加数据  
            //完成单张图片的缓存 先吧单张图片下下来  缓存到磁盘中 取到了参数之后在对图片进行计算大小
            cacheStatusImage(list, finished: finished)
            }
        }
}
    //一步加载图片
    private class func cacheStatusImage(array: [StatusModel], finished: (array: [StatusModel]?) -> ()) {
        //缓存单张图片  单张的图片
        if array.count == 0 {
            //没有数据的时候 需要把原来的数据返回回去   不然的话 程序会直接返回 一直显示在刷新 没有数据出来
            finished(array: array)
            return
        }
        //创建群组
        let group = dispatch_group_create()
        
        //遍历模型数组
        for  s in array {
            //在这里需要设置的原创微博 和转发微博两个微博的数组
            if let imageurls = s.pictureURLs{ //在这里需要看看url 数组中拿到的时几张图片
                if imageurls.count != 1 {
                   //判断数组是不是为一  如果数组中得元素不是为一的 就继续循环
                    
                    //continue 的意思是当这个条件成立 就跳出循环执行下一个循环  就不会再走下面的程序了 所以在这里保证数据下面的数据永远是 为1 条微博的数据
                    continue
                }
                //一定是单张图片
                for url in imageurls {
                   //开始下载图片
                   //异步加载图片的开始
                   // 向数组中添加一步任务
                  dispatch_group_enter(group) //把数组中添加到组中 这个是将所有的图片全部添加到数组当中  添加完成之后在进行入组
                     print("图片")
                    
                //一步下载图片
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: [], progress: nil, completed: { (_, _, _, _, _) -> Void in
                    
                    //这个是完成之后的回调 只有当20 条数据全部加载完成才会执行回调
                    print("单张图片下载完成")
                    //创建一个组 当组中得照片全部下载完成之后 就通知去更新操作
                   dispatch_group_leave(group)
                     // print("单张图片")
                })
                    
                }
              
            }
        }
        
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            //在主线程完成回调
            print("所有的一步图片下载完成")
            //下载完成之后就执行会掉 
            finished(array: array)
        }
    
    }
    
    
    
//        AFN.GET(uslSting, parameters: parameters, success: { (_, result) -> Void in
//            
//            guard let dict = result as? [String : AnyObject] else { //守卫 保证数据result 一定是有值的
//                
//                finished(arr: nil)
//                return
//            }
//            if let arrM = dict["statuses"] as? [[String : AnyObject]] { //字典转模型 把数组中得值给arrm 模型  把字典中模型取出来赋值给数组 [[]] 相当于一个字典外面包了一层数组 这个就相当于把字典定义成数组的形式  statuse是数据中得一个字段 保存的时字典 需要数据取出来
//                
//                var list = [StatusModel]() //初始化的数组
//                
//                for item in arrM {
//                    
//                    let s = StatusModel(dict: item) //字典转模型
//                    
//                    list.append(s)
//                }
//                
//                finished(arr: list) //执行回调 给数组中添加数据
//            }
//            
//            }) { (_, error) -> Void in
//                
//                finished(arr: nil)
//                print(error)
//        }
//    }

}
